package com.baizhi.socked;

/**
 * 线程通信： 因为每一条线程是单独完成自己的任务的，但是有时候，A线程在完成任务一的时候需要配合B线程完成任务B，这样A线程就需要和B线程进行通信
 * 比如我们之前写的图片下载和图片显示，图片下载是通过download线程完成的，图片和文字的显示是通过show线程完成的，show要显示图片必须等
 * download下载完图片，才能显示，这时候我们用 join方法 等待dowload现充终止，show线程才继续执行，这就是线程通信 join等待，是有时间限制的
 * 等到download执行完即可
 */
public class SockedDemo {
    public static void main(String[] args) {
        //目标：创建两条线程，分别输出 A B C D E Z   1 2 3 4 5 26
        // 输出格式是  A 1  B  2   c  3

        Object o = new Object();

        Thread t1 = new Thread(()->{ //我输出1 然后等待你输出A 我在输出2 等待你输出B
           synchronized (o){
               for (int i = 1; i < 27; i++) {
                   System.out.println(i);
                   try {
                       Thread.sleep(1000);
                       o.wait(); //t1进入等待   wait等待，是无限制永远等待，需要唤醒
                       //此处需要把t2唤醒
                        o.notify(); //把t2唤醒

                   } catch (InterruptedException e) {
                       e.printStackTrace();
                   }
               }
           }
        });


        Thread t2 = new Thread(()->{
          synchronized (o){
              for (char c = 'A';  c <= 'Z'  ; c++) {
                  System.out.println(c);
                  try {

                      Thread.sleep(1000);
                      o.notify(); //此处是把t1线程唤醒了
                      //t2需要等t1输出
                      o.wait(); //t2进入等待
                  } catch (InterruptedException e) {
                      e.printStackTrace();
                  }
              }
          }
        });

        t1.start();
        t2.start();
    }
}
